package proyecto2.src.controles;

import java.awt.Rectangle;
import java.util.Random;
import java.util.Vector;

import proyecto2.src.aplicacion.Juego;
import proyecto2.src.entidades.Enemiga;
import proyecto2.src.entidades.Principal;
import proyecto2.src.municiones.MunicionX;

public class ControlOmega extends control {

	protected Vector<MunicionX> municionesAInsertar;
	protected Vector<MunicionX> municionesActuales;
	protected Vector<MunicionX> municionesAEliminar;

	protected Vector<Enemiga> enemigasAInsertar;
	protected Vector<Enemiga> enemigasActuales;
	protected Vector<Enemiga> enemigasAEliminar;
	protected static final int  MAX_NAVESENPANTALLA = 5;
	protected int contNaves;
	protected boolean limpiarPantalla;
	protected boolean eliminarTodasEnemigas;
	
	protected Random generador;


	public ControlOmega(Juego j) {
		this.juego = j;
		contNaves=0;

		municionesAInsertar = new Vector<MunicionX>();
		municionesActuales = new Vector<MunicionX>();
		municionesAEliminar = new Vector<MunicionX>();

		enemigasAInsertar = new Vector<Enemiga>();
		enemigasActuales = new Vector<Enemiga>();
		enemigasAEliminar = new Vector<Enemiga>();

		generador = new Random();

		limpiarPantalla = false;
		eliminarTodasEnemigas = false;
	}


	public void run() {
		try {
			while(juego.obtenerJuegoCorriendo()) {

				agregarEnemigasAgregables();
				agregarMunicionesAgregables();

				//EMPIEZA BLOQUE ENEMIGAS
				int creador= generador.nextInt(5);
				if(creador==0 && (contNaves < MAX_NAVESENPANTALLA)){
					juego.getNivelActual().crearEnemigo();
					contNaves++;
				}


				for(Enemiga e: enemigasActuales){	
					int moneda= generador.nextInt(15);
					if(moneda==0){
						e.disparar(e.getLocation());
					}
					e.mover();					
					if(juego.estaFueraDePantalla(e)){
						eliminarEnemiga(e);	}
					else{
						Rectangle areaColisionPrincipal = juego.getNivelActual().obtenerNavePrincipal().getBounds();	
						if (e.getBounds().intersects(areaColisionPrincipal)) {
							e.chocar();								
						}
					}				

					if (limpiarPantalla || eliminarTodasEnemigas) {
						eliminarEnemiga(e);
					}
				}


				//EMPIEZA BLOQUE MUNICIONES
				for (MunicionX m : municionesActuales) {
					m.actualizarPosicion();		
					boolean colisiono=m.calcularColisiones();					
					if ((colisiono)||(juego.estaFueraDePantalla(m))) {
						this.eliminarMunicion(m);						
						juego.eliminarGraficamenteDelNivel(m);
					}
					if (limpiarPantalla) {
						eliminarMunicion(m);
					}
				}		

				eliminarEnemigasEliminables();
				eliminarMunicionesEliminables();
				limpiarPantalla = false;
				eliminarTodasEnemigas = false;

				this.sleep(30);
			}

			eliminarTodoGraficamente();
		}
		catch (InterruptedException ex) {
		}
	}

	public void limpiarPantalla(){
		limpiarPantalla = true;		
	}
	
	public void eliminarTodasLasEnemigas() {
		eliminarTodasEnemigas = true;
	}
	

	public void agregarEnemiga(Enemiga e) {
		enemigasAInsertar.add(e);
	}


	public void eliminarEnemiga(Enemiga e) {
		enemigasAEliminar.add(e);
		contNaves--;
	}


	public void agregarMunicion(MunicionX m) {
		municionesAInsertar.add(m);
	}


	public void eliminarMunicion(MunicionX m) {
		municionesAEliminar.add(m);
	}


	private void agregarEnemigasAgregables() {
		for (Enemiga e : enemigasAInsertar) {
			enemigasActuales.add(e);
		}

		enemigasAInsertar.clear();
	}


	private void agregarMunicionesAgregables() {
		for (MunicionX m : municionesAInsertar) {
			municionesActuales.add(m);
		}

		municionesAInsertar.clear();
	}


	private void eliminarEnemigasEliminables() {
		for (Enemiga e : enemigasAEliminar) {
			enemigasActuales.remove(e);
			juego.eliminarGraficamenteDelNivel(e);
		}

		enemigasAEliminar.clear();
	}


	private void eliminarMunicionesEliminables() {
		for (MunicionX m : municionesAEliminar) {
			municionesActuales.remove(m);
			juego.eliminarGraficamenteDelNivel(m);
		}

		municionesAEliminar.clear();
	}


	public boolean controlarColicionNavesEnemigas( MunicionX m){
		Rectangle areaColision = m.getBounds();
		boolean colisiono=false;
		for (Enemiga e :  enemigasActuales) {
			if (e.getBounds().intersects(areaColision)) {
				juego.getNivelActual().sumarPuntaje(e.getPuntaje());
				e.recibirDisparo(m.getDanio());							
				colisiono = true;
			}
		}
		return colisiono;
	}

	public boolean controlarColicionNavePrincipal( MunicionX m){
		Rectangle areaColision = m.getBounds();
		boolean colisiono=false;		
		Principal p=juego.getNivelActual().obtenerNavePrincipal();
		if (p.getBounds().intersects(areaColision)) {				
			p.recibirDisparo(m.getDanio());						
			colisiono = true;
		}
		return colisiono;
	}


	//método por el momento invocado únicamente al caer en Game Over
	public void eliminarTodoGraficamente() {
		for (Enemiga e : enemigasActuales) {
			juego.eliminarGraficamenteDelNivel(e);
		}
		for (MunicionX m : municionesActuales) {
			juego.eliminarGraficamenteDelNivel(m);
		}
		juego.eliminarGraficamenteDelNivel(juego.getNivelActual().obtenerNavePrincipal());
	}

}
